package jeu;

import java.io.IOException;
import java.util.*;

import utils.StringUtils;

import elements.dictionnaire.Dictionnaire;
import elements.jetons.Rack;
import elements.jetons.Sac;

public class IA extends Joueur {

	private Dictionnaire dico;

	/**
	 * Constructeur de l'ia
	 * 
	 * @param d
	 */
	public IA(Dictionnaire d) {
		super("IA");
		dico = d;
	}

	/** buggggggggggggggggggggggggggggggggggggggg
	 * Fonction qui test le nombre de point que rapport le mot en fonction des
	 * points de chacune des lettres
	 * 
	 * @param listemots
	 * @return mot
	 */
	public String meilleurmot(List<String> listemots) {
		String mot = null;
		int point = 0;
		Iterator<String> it = listemots.iterator();
		while (it.hasNext()) {
			String texte = it.next();
			int tmp = 0;
			for (int i = 0; i < texte.length(); ++i)
				tmp += Dictionnaire.valeurLettre(texte.charAt(i));
			if (tmp > point) {
				tmp = point;
				mot = texte;
			}
		}

		return mot;
	}

	/**
	 * Recherche les mots contenant la lettre envoyée en paramètre à la position
	 * donnée par l'index passé en paramètre dans la liste l
	 * 
	 * @param index
	 * @param lettre
	 * @param l
	 * @return listemot
	 */
	public List<String> recherchemot(int index, char lettre, List<String> l) {
		List<String> listemot = new ArrayList<String>();

		Iterator<String> it = l.iterator();
		while (it.hasNext()) {

			String texte = it.next();
			if (texte.length() > index) {
				if (texte.charAt(index) == lettre) {
					listemot.add(texte);
				}
			} else
				listemot.add(texte);
		}

		return listemot;
	}

	/**
	 * 
	 * @param list
	 * @param rack
	 * @param index
	 * @return
	 */
	public List<String> test(List<String> list, List<Character> rack, int index) {
		List<String> listmot = new ArrayList<>();
		List<String> listfinal = new ArrayList<>();


		if (rack.size() > 1){

			for(int lettre = 0 ; lettre < rack.size() ; ++lettre ) 
			{		
				List <Character>rack1 = rack;
				rack1.remove(lettre);
				listmot.addAll(test(listmot, rack1 , ++index));
			}
			for(int lettre = 0 ; lettre < rack.size(); ++lettre)
				listfinal.addAll(recherchemot(index, rack.get(lettre), listmot));
		}
		listfinal.addAll(recherchemot(index, rack.get(0), list));
		return listfinal;
	}

	/**
	 * Cette fonction devrait retourner le mot qui rapport le maximum de point avec les lettres
	 * dans le Rack du joueur IA.
	 *  
	 * @return
	 */

	public String recherche_meilleur_mot() {
		
		List<String> mots = null;
		String motRack = "";
		
		for (int i = 0; i < Rack.NOMBRE_LETTRES; i++)
			motRack += super.rack.getCase(i).getJeton().getLettre();
		
		mots = StringUtils.anagrammes(motRack);
		
		for (String x: mots) {
			System.out.println(x);
		}

		// Parce que 'faut retourner quelque chose
		return mots.get(0);
		
		/*
		List<Character> listeJeton = new ArrayList<Character>();
		List<String> liste_mot = new ArrayList<String>();

		for (int i = 0; i < super.rack.getJetonsCourants(); ++i) {
			listeJeton.add(super.rack.getCase(i).getJeton().getLettre());
		}

		for (int lettre = 0; lettre < listeJeton.size(); ++lettre) {
			List<String> listtmp = dico.getListeMots();
			listtmp = recherchemot(0, listeJeton.get(lettre), listtmp);

			List<Character> rack = new ArrayList<Character>();
			for (int i = 1; i < listeJeton.size(); ++i)
				rack.add(listeJeton.get(i));

			listtmp = test(listtmp, rack, 1);
			System.out.println("test");
			Iterator<String> it = listtmp.iterator();
			while (it.hasNext()) {
				String tmp = it.next();
				System.out.print(tmp + " _ ");
			}
			System.out.println("");

			liste_mot.addAll(listtmp);
		}
		return meilleurmot(liste_mot);
		*/
	}

	public static void main(String[] argc) throws IOException {
		try {
			Sac s = new Sac("data/dicos/dico_francais.txt");
			IA jeu = new IA(s.prendreDico());
			jeu.rack.piocher(s);

			System.out.println("meilleur mot :" +jeu.recherche_meilleur_mot());

			jeu.rack.afficherConsole();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}